﻿#pragma once

#include "algo_runge_kutta.h"

#include <ctime>

namespace CAGD
{

/**
 * @file ODESolver.h
 * @author xingyifan
 * @date 2022-07-29 00:18
 *
 * @description: 一般 ODE 的求解算法
 */
class ODESolver
{
  public:
    /**
     * @brief Runge-Kutta 方法计算 N 步递推的结果，返回计算时间.
     * @return
     * @param f
     * @param G
     * @param Z
     * @see
     */
    double operator()(FuncXXt f, TimeGrid &G, RungeKutta *Z)
    {
        // 计算步数
        int N = G.size();

        // 指针位置
        GTimer U = G.begin();

        // 开始计时
        clock_t start = clock();

        // 循环计算每一步，N 个节点，移动 N-1 次
        for (int i = 1; i < N; i++)
            U = Z->shift(f, U);

        // 结束计时
        double t = double(clock() - start) / CLOCKS_PER_SEC;

        return t;
    }
};

} // namespace CAGD
